#include<stdio.h>
#include<stdbool.h>
#define Min(a,b)  (a)<(b)?a:b  


size_t MyStrlen(const char*s)
{
    size_t count=0;
    while(*s++!='\0')
    {
        count++;
        
    }
    return count;
}

void MyStrcpy(char *dest,const char *src)
{
    
    while(*src!='\0')
    {
      *dest++=*src++;
    }
    *dest='\0';
}
void Mystrncpy(char *dest,const char *src,size_t n)
{
    while(*src!='\0'&&n--!=0)
    {
      *dest++=*src++;
    }
    *dest='\0';
}
int MyStrcmp(const char*s1,const char*s2)
{
   
    while(*s1==*s2&&*s1!='\0'&&s2!='\0')
    {
        s1++;
        s2++;
    }
    
    return *s1-*s2;

}
int MyStrncmp(const char*s1,const char*s2,size_t n)
{
    
    size_t minlen=Min(Min(MyStrlen(s1),MyStrlen(s2)),n);
    if(minlen==n)
    {

    while(*s1==*s2&&minlen--!=1)//是1不是0的原因是最后一个数直接跳出循环做减法
    {
        s1++;
        s2++;
       
    }
    return *s1-*s2;
    }
    else
    {
        return MyStrcmp(s1,s2);
    }
}

void MyStrcat(char *dest,const char*src)
{
    MyStrcpy(dest+MyStrlen(dest),src);
}

void MyStrncat(char *dest,const char *src,size_t n)
{
    Mystrncpy(dest+MyStrlen(dest),src,n);
}

//滑动窗口算法
char *MyStrstr(char *dest,const char *src)
{
    size_t dlen=MyStrlen(dest);
    size_t slen=MyStrlen(src);
    for(int i=0;i<=dlen-slen;i++)
    {
        if(MyStrncmp(dest+i,src,slen)==0)
        {
            return dest+i;
        }
    }
    return NULL;

}

bool IsHaveChar(const char*s,char c)//判断是否是分隔符函数
{
    while(*s!='\0')
    {
        if(*s==c)
            return true;
        s++;
    }
   return false;
}

char *MyStrtok(char*src,const char*delim)
{   
    //上一次切割完的下一个字符串的首地址,
    static char *nextStr=NULL;//多次切割需要用static来存指针，增加生命周期
    if(src==NULL)//想要继续切割上一次的字符串。
        src=nextStr;
    if(src==NULL)//没有字符串可以被操作
        return NULL;

    //跳过所有的分隔符
    while(*src!='\0')
    {
        //判断是否是分隔符
        if(IsHaveChar(delim,*src)==true)
        {
            src++;
        }
        else
            break;//找到第一个不是分隔符的位置
    }
    if(*src=='\0')//这种如果全是分隔符就直接结束返回null
        return NULL;

    //src:有效字符串的首地址
    //怎么切割：找下个一个分隔符将其变为\0
    char *end=src;
    while(*end!='\0')
    {
        //是下一个分隔符
        if(IsHaveChar(delim,*end)==true)
        {
            
            break;
        }
          end++;
    }   
    if(*end=='\0')//没有下一个字符串可以切割了
      {
             nextStr=NULL;
      } 
      else
      {
            *end='\0';
            nextStr=end+1;
      }
        return src;
    
}












int main()
{

   //   printf("%ld\n",MyStrlen("helloworld"));
    


   // const char *s="world";
    //char str[20]="hello";
    //MyStrncat(str,s,3);
    //printf("%s\n",str);



   // char str[20]="helloworld";
   // const char *s="llo";
    //char *a=MyStrstr(str,s);
   // printf("%s\n",a);

        char str[]="zhangsan,lisi.wangwu";
        char *s=MyStrtok(str,",.");
        




    return 0;

}


 